package com.cskaoyan.javase.oop3._2inner._5anonymous._3exercise;

/**
 * 不修改main方法和接口Inter的前提
 * 补齐Outer类代码，要求在控制台输出HelloWorld
 *
 * main方法中
 * Outer.method().show();链式调用,输出的结果是"hello world"
 * 很明显,show方法的执行结果是在控制台输出"hello world!"
 * Outer.method()
 * 首先method方法可以用类名点调用,它是一个Outer类当中的静态方法
 * Outer.method() 这个方法调用之所以能够继续链式调用,说明它的返回值是一个对象
 * 并且show方法是接口Inter当中的抽象方法
 * 所以Outer.method() 方法调用的返回值,是返回一个接口Inter的子类对象
 *
 * @since 11:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Test {
    public static void main(String[] args) {
        Outer.method().show();
    }
}

interface Inter {
    void show();
}

class Outer {
    public static Inter method() {
        // return new InterImpl();
        // 局部内部类
        /*class InterImpl implements Inter {
            @Override
            public void show() {
                System.out.println("局部内部类 hello world!");
            }
        }
        return new InterImpl();*/
        // 最简单的是使用匿名内部类对象
        /*return new Inter() {
            @Override
            public void show() {
                System.out.println("匿名内部类 hello world!");
            }
        };*/
        // Anonymous new Inter() can be replaced with lambda
        return () -> System.out.println("匿名内部类 hello world!");
    }
}

// 传统方法
class InterImpl implements Inter {
    @Override
    public void show() {
        System.out.println("hello world!");
    }
}